package com.atguigu.servlet;

import com.atguigu.utls.JedisPoolUtils;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Transaction;

import java.io.IOException;
import java.util.List;


public class SecKill_redis {
	
	private static final  org.slf4j.Logger logger =LoggerFactory.getLogger(SecKill_redis.class) ;

	public static void main(String[] args) {
 
 
		Jedis jedis =new Jedis("192.168.192.132",6379);
		
		System.out.println(jedis.ping());
	 
		jedis.close();
	}
	
	public static boolean doSecKill(String uid,String prodid) throws IOException {

		//获取jedis对象
		JedisPool jedisPoolInstance = JedisPoolUtils.getJedisPoolInstance();
		Jedis jedis = jedisPoolInstance.getResource();

		//拼接key
		String kcKey = "seckill:"+prodid+":kc";
		String userKey = "seckill:"+prodid+":user";
		//通过watch监视库存
		jedis.watch(kcKey);
		//获取redis中存储的库存信息
		String kcStr = jedis.get(kcKey);
		//判断库存是否已经存在于redis中，即秒杀是否开始
		if(kcStr == null){
			//表示秒杀还未开始
			System.out.println("秒杀还未开始。。。");
			jedis.close();
			return false;
		}
		//判断uid是否已经存在于redis中，即判断当前用户是否已经秒杀成功
		if(jedis.sismember(userKey, uid)){
			//表示用户已经秒杀成功
			System.out.println("已经秒杀成功。。。");
			jedis.close();
			return false;
		}
		//获取Integer类型的库存数量
		int kc = Integer.parseInt(kcStr);
		//判断库存是否足够
		if(kc <= 0){
			//表示没有库存，秒杀已经结束
			System.out.println("秒杀已经结束。。。");
			jedis.close();
			return false;
		}
		//开启事务
		Transaction transaction = jedis.multi();
		//库存足够，秒杀成功，减库存，加人
		transaction.decr(kcKey);
		transaction.sadd(userKey, uid);
		//执行事务队列中所有的命令
		List<Object> exec = transaction.exec();
		//判断事务是否正常执行
		if(exec.size() == 0){
			System.out.println("你很不幸。。。");
		}else{
			System.out.println("秒杀成功。。。");
		}
		jedis.close();
		return true;

	}
	
	
	
	
	
	
}
















